import { reactive, ref, watch,ExtractPropTypes } from "vue";
import type { FormInstance, FormRules } from "element-plus";
import ajax from "@/util/request";

/**
 * 
 * @param modelName 
 * @param props props对象，需要使用defineProps创建后传入
 * @param emits emits对象，需要使用defineEmits创建后传入
 * @param formRules 
 * @param insertURL 
 * @returns 
 */
function setupUpdate(modelName: string,
    props: Readonly<ExtractPropTypes<any>>,
    emits: any,
    formRules: FormRules,
    queryRowURL: string | undefined,
    updateURL = `/${modelName}/update`
) {

    let updated = false;

    const myForm = ref<FormInstance>();
    const formData = reactive({});

    const rules = reactive<FormRules>(formRules);


    /**
     * 重置表单
     * @param obj 重置的数据
     */
    function handleReset(obj: any) {
        updated = false;

        // 如果传递获取一行数据的URL，那么通过异步加载初始化表单数据
        if (queryRowURL) {
            ajax(queryRowURL, { ...obj }).then(
                ({ data }) => {
                    if (data.status > 0) {
                        Object.assign(formData, data.result_data);
                    }
                }
            );
        // 否则直接通过列表组件（父组件）传来的数据重置
        } else {
            Object.assign(formData, obj);
        }
    }

    watch(
        () => props.updateData,
        (newVal) => {
            if (!newVal) {
                return;
            }
            handleReset(newVal)
        },
        {
            immediate: true
        }
    );

    /**
     * 关闭组件
     */
    function handleClose() {
        emits("close", updated);
    }

    /**
     * 提交修改
     * @param myForm 修改表单
     */
    function handleUpdate(myForm: FormInstance) {
        myForm.validate((valid) => {
            if (!valid) {
                return;
            }
            ajax(updateURL, { ...formData }).then(({ data }) => {
                if (data.status > 0) {
                    alert({ type: "success", message: "修改成功" });

                    updated = true;

                    // 关闭，并告知列表组件，有数据更新
                    handleClose();
                }
            });
        });
    }

    return {
        rules, myForm, formData, handleReset, handleClose, handleUpdate
    }
}

export default setupUpdate;